// app.js
App({
  envId: 'cloud1-1ga8zsp16c57584a',
  openid: '',
  //存用户授权拿到的对象
  _userInfo: {},
  //存该用户在users表的记录
  personInfo: {},
  navTmpInfo: {},


  watchUserInfo(method) {
    var that = this;
    let obj = this.globalData;
    Object.defineProperty(obj, "userInfo", {
      configurable: true, //描述属性是否配置，以及可否删除 false 时，不能删除当前属性，且不能重新配置当前属性的描述符(有一个小小的意外：true时，可以删除当前属性，可以配置当前属性所有描述符。
      enumerable: true, //描述属性是否会出现在for in 或者 Object.keys()的遍历中
      set: function (value) {
        that._userInfo = value;
        method(value);
      },
      get: function () {
        // 可以在这里打印一些东西，然后在其他界面调用getApp().globalData.userInfo的时候，这里就会执行。
        return that._userInfo
      }
    })
  },

  setUserInfoStorageTime() {
    var that = this;
    let nowTime = Date.now();
    let oldTime = wx.getStorageSync("userInfoStorageTime");
    let userInfo = wx.getStorageSync("_userInfo");
    if (userInfo.nickName != undefined && userInfo.nickName != null && userInfo.nickName != "") {
      if (oldTime && nowTime < oldTime) {
        getApp().userInfo = userInfo;
        console.log(getApp().userInfo);
        return;
      } else {
        that.getUserProfile();
      }
    } else {
      that.getUserProfile();
    }
  },

  getUserProfile() {
    let db = wx.cloud.database();
    let that = this;
    wx.showModal({
      title: "提示",
      content: "为了让您有更好的小程序体验，我们需要获取您的微信昵称和头像，实际上并不保存这两项信息，请放心授权",
      success(res) {
        if (res.confirm) {
          wx.getUserProfile({
            desc: "用于完善用户资料", // 声明获取用户个人信息后的用途，后续会展示在弹窗中，请谨慎填写
            success: (res) => {
              wx.showLoading({
                title: "授权中"
              })
              getApp().userInfo = res.userInfo;
              console.log(getApp().userInfo);
              wx.setStorageSync("_userInfo", res.userInfo);

              let setNowTime = Date.now() + 3600 * 1000 * 24 * 30; // 设置了30天有效期
              wx.setStorageSync("userInfoStorageTime", setNowTime);
              //保存头像地址
              db.collection("users").doc(getApp().personInfo._id).update({
                data: {
                  avatarUrl: getApp().userInfo.avatarUrl,
                  gender: getApp().userInfo.gender
                },
                success: res => {
                  console.log(getApp().userInfo.avatarUrl)
                  console.log(res);
                },
                fail: res => {
                  console.log(res);
                },
                complete: () => {
                  wx.hideLoading();
                  wx.showToast({
                    title: '授权成功',
                  })
                }
              })
            },
            fail: function (err) {
              that.getUserProfile();
            },
          });
        } else {
          that.getUserProfile();
        }
      },
    });
  },

  onLaunch: function () {


    wx.showLoading({
      title: '获取open_id中',
      mask: true
    });
    if (!wx.cloud) {
      console.error('请使用 2.2.3 或以上的基础库以使用云能力');
    } else {
      wx.cloud.init({
        // env 参数说明：
        //   env 参数决定接下来小程序发起的云开发调用（wx.cloud.xxx）会默认请求到哪个云环境的资源
        //   此处请填入环境 ID, 环境 ID 可打开云控制台查看
        //   如不填则使用默认环境（第一个创建的环境）
        env: 'cloud1-1ga8zsp16c57584a',
        traceUser: true,
      });

    };
    const db = wx.cloud.database();
    var that = this;

    wx.cloud.callFunction({
      name: 'quickstartFunctions',
      config: {
        env: 'cloud1-1ga8zsp16c57584a'
      },
      data: {
        type: 'getOpenId'
      }
    }).then((resp) => {
      console.log(resp);
      getApp().openid = resp.result.openid;
      console.log("_openid（该用户的唯一标识）：" + getApp().openid);

      //读取数据库中用户的信息，如果用户是首次登陆，则记录用户信息
      db.collection('users').where({
        _openid: getApp().openid
      }).get({
        success: resp => {
          // res.data 包含该记录的数据
          // console.log(resp.data);
          // console.log(resp.data.length);
          // 没有此用户
          if (resp.data.length == 0) {
            db.collection('users').add({
              data: {
                authority: 'common',
                name: '',
                email: '',
                phone: '',
                city: '',
                identity: '',
                sex: '',
                avatarUrl: ''
              },
              success: resp => {
                db.collection('users').where({
                  _openid: getApp().openid
                }).get({
                  success: Res => {
                    getApp().personInfo = Res.data[0];
                    console.log(getApp().personInfo);
                  },
                  fail: Res => {
                    console.log(Res);
                  }
                })
                console.log(resp);
              },
              fail: resp => {
                console.log(resp);
              }
            })
          } else {
            getApp().personInfo = resp.data[0];
            console.log(getApp().personInfo);
          }
        },
        fail: function (resp) {
          console.log(resp);
        },
        complete: () => {
          // 关闭加载动效
          wx.hideLoading();
        }
      })


      // 获取缓存
      that.setUserInfoStorageTime();


    }).catch((e) => {
      that.setUserInfoStorageTime();
      wx.hideLoading();
    });
  },
  /**
   * 设置监听器
   */
  setWatcher(data, watch, page) { // 接收index.js传过来的data对象和watch对象
    Object.keys(watch).forEach(v => { // 将watch对象内的key遍历
      this.observe(page, data, v, watch[v]); // 监听data内的v属性，传入watch内对应函数以调用
    })
  },
  /**
   * 监听属性 并执行监听函数
   */
  observe(page, obj, key, watchFun) {
    var val = obj[key]; // 给该属性设默认值
    Object.defineProperty(obj, key, {
      configurable: true,
      enumerable: true,
      set: function (value) {
        // console.log(value, val)
        // val = value;//这里赋值会导致newValue oldValue一样
        watchFun.call(page, value, val); // 赋值(set)时，调用对应函数
      },
      get: function () {
        return val;
      }
    })
  }
});